You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.5 KiB
102 lines
3.5 KiB
import { defineEventHandler, getRouterParam, readBody, setResponseHeaders } from "h3";
|
|
import { getCurrentUser, getConfigUser, getConfigGlobal } from "#server/utils/context";
|
|
import { resolveAgentIdentity } from "#server/service/agent/identity";
|
|
import { getSessionByIdAndUser } from "#server/service/agent/session";
|
|
import { getAgentBySlug } from "#server/service/agent/agent";
|
|
import { executeChat } from "#server/service/agent/chat-engine";
|
|
import { registerAbortController, unregisterAbortController } from "#server/service/agent/abort-manager";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const agentSlug = getRouterParam(event, "agentSlug");
|
|
if (!agentSlug) {
|
|
throw createError({ statusCode: 400, statusMessage: "参数无效" });
|
|
}
|
|
|
|
const agent = await getAgentBySlug(agentSlug);
|
|
if (!agent) {
|
|
throw createError({ statusCode: 404, statusMessage: "agent 不存在" });
|
|
}
|
|
|
|
const identity = await resolveAgentIdentity(event);
|
|
if (!identity.userId && !identity.tempToken) {
|
|
throw createError({ statusCode: 401, statusMessage: "请先登录或创建临时会话" });
|
|
}
|
|
|
|
const body = await readBody(event);
|
|
const { sessionId, content, editMessageId, regenerate, continueAfterApproval, approvalToolCallId, approved, approvalReason, enableThinking, enableTools } = body as {
|
|
sessionId: string;
|
|
content: string;
|
|
editMessageId?: string;
|
|
regenerate?: boolean;
|
|
continueAfterApproval?: boolean;
|
|
approvalToolCallId?: string;
|
|
approved?: boolean;
|
|
approvalReason?: string;
|
|
enableThinking?: boolean;
|
|
enableTools?: boolean;
|
|
};
|
|
|
|
if (!sessionId) {
|
|
throw createError({ statusCode: 400, statusMessage: "参数无效" });
|
|
}
|
|
|
|
const isApprovalContinue = continueAfterApproval === true && approvalToolCallId;
|
|
if (!isApprovalContinue && (!content || typeof content !== "string" || content.trim().length === 0)) {
|
|
throw createError({ statusCode: 400, statusMessage: "参数无效" });
|
|
}
|
|
|
|
const session = await getSessionByIdAndUser(sessionId, identity.userId, identity.tempToken);
|
|
if (!session) {
|
|
throw createError({ statusCode: 404, statusMessage: "会话不存在" });
|
|
}
|
|
|
|
if (session.agentId !== agent.id) {
|
|
throw createError({ statusCode: 400, statusMessage: "会话不属于该 agent" });
|
|
}
|
|
|
|
const ip = getRequestIP(event, { xForwardedFor: true }) || "unknown";
|
|
|
|
let preferredModelId: number | null = null;
|
|
let reviewApprovalMode: string = "manual";
|
|
if (identity.userId) {
|
|
preferredModelId = (await getConfigUser(event, "preferredLlmModelId")) ?? null;
|
|
reviewApprovalMode = (await getConfigUser(event, "reviewApprovalMode")) ?? "manual";
|
|
}
|
|
|
|
const globalDefaultModelId = (await getConfigGlobal("agentDefaultModelId")) ?? null;
|
|
|
|
const user = identity.userId ? await getCurrentUser(event) : null;
|
|
|
|
const { response } = await executeChat({
|
|
agent,
|
|
session,
|
|
user: user ? { id: user.id, role: user.role } : null,
|
|
tempToken: identity.tempToken,
|
|
body: {
|
|
content,
|
|
editMessageId,
|
|
regenerate,
|
|
continueAfterApproval,
|
|
approvalToolCallId,
|
|
approved,
|
|
approvalReason,
|
|
enableThinking,
|
|
enableTools,
|
|
},
|
|
ip,
|
|
preferredModelId,
|
|
globalDefaultModelId,
|
|
reviewApprovalMode,
|
|
requestId: event.context.requestId,
|
|
registerAbort: registerAbortController,
|
|
unregisterAbort: unregisterAbortController,
|
|
setRateLimitHeaders: (headers) => {
|
|
setResponseHeaders(event, headers);
|
|
},
|
|
onClientClose: (cb) => {
|
|
event.node.req.on("close", cb);
|
|
},
|
|
});
|
|
|
|
return response;
|
|
});
|
|
|